198. 打家劫舍

198. House Robber

Similar Question

Solution Tips

方案一: 动态规划

步骤一: 定义子问题

pC4Ma8I.png

步骤二: 写出子问题的递推关系

pC4Md2t.png

步骤三: 确定 DP 数组的计算顺序

pC4MDr8.png

var rob = function(nums) {
    // 1. 定义 dp[i] 为偷前 i 家, 能获得最大价值
    // 2. dp[i] = money[i] + dp[i - 2], 偷了这家就只能偷前前家了
    const dp = Array.from({ length: nums.length }, () => 0);
    if (nums.length === 1) {
        return nums[0];
    }
    // 3. 第一家和第二家就只能偷自己的
    dp[0] = nums[0];
    // 这里究竟应该是 nums[1] 还是取 max 呢? 取 max 其实是 ok 的, 对于 nums[2], 反正都不会参考 nums[1]
    // 对于 nums[3], 要参考 nums[1] 时, 无论打劫的是第一家还是第二家都是符合题意的
    dp[1] = Math.max(nums[0], nums[1]);
    for (let i = 2; i < nums.length; i++) {
        // dp[i] = nums[i] + dp[i - 2];
        // 根据 dp[i] 的定义, 如果不偷这一家的收益更大, 那么就不应该偷的
        dp[i] = Math.max(nums[i] + dp[i - 2], dp[i - 1]);
    }
    // console.log(dp.concat());
    // return Math.max(dp[nums.length - 1], nums[nums.length - 2]);
    return dp[nums.length - 1];
};
console.log(rob([2,7,9,3,1]));
// console.log(rob([1,2,3,1]));